home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / CUGUK / PROG_TOO / C027B.ZIP / JAS / LEX.C < prev    next >
Text File  |  1990-03-30  |  8KB  |  302 lines

  1.  
  2. /*
  3.  * Copyright (c) 1988 by Sozobon, Limited.  Author: Joseph M Treat
  4.  *
  5.  * Permission is granted to anyone to use this software for any purpose
  6.  * on any computer system, and to redistribute it freely, with the
  7.  * following restrictions:
  8.  * 1) No charge may be made other than reasonable charges for reproduction.
  9.  * 2) Modified versions must be clearly marked as such.
  10.  * 3) The authors are not responsible for any harmful consequences
  11.  *    of using this software, even if they result from defects in it.
  12.  */
  13.  
  14. #include "jas.h"
  15. #include "scan.h"
  16. #include "parse.h"
  17.  
  18. extern do_star;
  19.  
  20. struct reserved words[] = {
  21.     /*
  22.      * alphabetized list of reserved words
  23.      */
  24.     { ".bss",    _BSS,        0 },
  25.     { ".comm",    _COMM,        0 },
  26.     { ".data",    _DATA,        0 },
  27.     { ".dc",    _DC,        0 },
  28.     { ".ds",    _DS,        0 },
  29.     { ".end",    END,        0 },
  30.     { ".equ",    _EQU,        0 },
  31.     { ".even",    _EVEN,        0 },
  32.     { ".globl",    _GLOBL,        0 },
  33.     { ".org",    _ORG,        0 },
  34.     { ".text",    _TEXT,        0 },
  35.     { "a0",        REG,        8 },
  36.     { "a1",        REG,        9 },
  37.     { "a2",        REG,        10 },
  38.     { "a3",        REG,        11 },
  39.     { "a4",        REG,        12 },
  40.     { "a5",        REG,        13 },
  41.     { "a6",        REG,        14 },
  42.     { "a7",        REG,        15 },
  43.     { "bss",    _BSS,        0 },
  44.     { "ccr",    SREG,        O_CCR },
  45.     { "comm",    _COMM,        0 },
  46.     { "d0",        REG,        0 },
  47.     { "d1",        REG,        1 },
  48.     { "d2",        REG,        2 },
  49.     { "d3",        REG,        3 },
  50.     { "d4",        REG,        4 },
  51.     { "d5",        REG,        5 },
  52.     { "d6",        REG,        6 },
  53.     { "d7",        REG,        7 },
  54.     { "data",    _DATA,        0 },
  55.     { "dc",        _DC,        0 },
  56.     { "ds",        _DS,        0 },
  57.     { "end",    END,        0 },
  58.     { "equ",    _EQU,        0 },
  59.     { "even",    _EVEN,        0 },
  60.     { "globl",    _GLOBL,        0 },
  61.     { "org",    _ORG,        0 },
  62.     { "pc",        PC,        0 },
  63.     { "sp",     REG,        15 },
  64.     { "sr",        SREG,        O_SR },
  65.     { "text",    _TEXT,        0 },
  66.     { "usp",    SREG,        O_USP },
  67.     { "", 0, 0 }
  68. };
  69.  
  70. int nwords = (sizeof words) / (sizeof (struct reserved));
  71.  
  72. struct lexacts actions[256];
  73.  
  74. struct lextab lextab[] = {
  75.     { '\t', { L_SKIP, 0 } },
  76.     { '\n', { L_TOKEN, NL } },
  77.     { '\r', { L_SKIP, 0 } },
  78.     { ' ', { L_SKIP, 0 } },
  79.     { '"', { L_EXTRA|L_TOKEN, ERR } },
  80.     { '\'', { L_EXTRA|L_TOKEN, ERR } },
  81.     { '%', { L_TOKEN, MOD } },
  82.     { '(', { L_TOKEN, LP } },
  83.     { ')', { L_TOKEN, RP } },
  84.     { '*', { L_TOKEN, STAR } },
  85.     { '-', { L_TOKEN, MINUS } },
  86.     { '+', { L_TOKEN, PLUS } },
  87.     { ',', { L_TOKEN, COMMA } },
  88.     { '/', { L_EXTRA|L_TOKEN, DIV } },
  89.     { '~', { L_EXTRA|L_TOKEN, NOT } },
  90.     { '#', { L_TOKEN, POUND } },
  91.     { '@', { L_EXTRA|L_DIGIT, NUMBER } },
  92.     { '$', { L_EXTRA|L_DIGIT, NUMBER } },
  93.     { '0', { L_MIDID|L_DIGIT, NUMBER } },
  94.     { '1', { L_MIDID|L_DIGIT, NUMBER } },
  95.     { '2', { L_MIDID|L_DIGIT, NUMBER } },
  96.     { '3', { L_MIDID|L_DIGIT, NUMBER } },
  97.     { '4', { L_MIDID|L_DIGIT, NUMBER } },
  98.     { '5', { L_MIDID|L_DIGIT, NUMBER } },
  99.     { '6', { L_MIDID|L_DIGIT, NUMBER } },
  100.     { '7', { L_MIDID|L_DIGIT, NUMBER } },
  101.     { '8', { L_MIDID|L_DIGIT, NUMBER } },
  102.     { '9', { L_MIDID|L_DIGIT, NUMBER } },
  103.     { ':', { L_TOKEN, COLON } },
  104.     { ';', { L_TOKEN|L_EXTRA, COMMENT } },
  105.     { '<', { L_EXTRA|L_TOKEN, ERR } },
  106.     { '>', { L_EXTRA|L_TOKEN, ERR } },
  107.     { 'A', { L_BEGID|L_MIDID|L_DIGIT, NAME } },
  108.     { 'B', { L_BEGID|L_MIDID|L_DIGIT, NAME } },
  109.     { 'C', { L_BEGID|L_MIDID|L_DIGIT, NAME } },
  110.     { 'D', { L_BEGID|L_MIDID|L_DIGIT, NAME } },
  111.     { 'E', { L_BEGID|L_MIDID|L_DIGIT, NAME } },
  112.     { 'F', { L_BEGID|L_MIDID|L_DIGIT, NAME } },
  113.     { 'G', { L_BEGID|L_MIDID, NAME } },
  114.     { 'H', { L_BEGID|L_MIDID, NAME } },
  115.     { 'I', { L_BEGID|L_MIDID, NAME } },
  116.     { 'J', { L_BEGID|L_MIDID, NAME } },
  117.     { 'K', { L_BEGID|L_MIDID, NAME } },
  118.     { 'L', { L_BEGID|L_MIDID, NAME } },
  119.     { 'M', { L_BEGID|L_MIDID, NAME } },
  120.     { 'N', { L_BEGID|L_MIDID, NAME } },
  121.     { 'O', { L_BEGID|L_MIDID, NAME } },
  122.     { 'P', { L_BEGID|L_MIDID, NAME } },
  123.     { 'Q', { L_BEGID|L_MIDID, NAME } },
  124.     { 'R', { L_BEGID|L_MIDID, NAME } },
  125.     { 'S', { L_BEGID|L_MIDID, NAME } },
  126.     { 'T', { L_BEGID|L_MIDID, NAME } },
  127.     { 'U', { L_BEGID|L_MIDID, NAME } },
  128.     { 'V', { L_BEGID|L_MIDID, NAME } },
  129.     { 'W', { L_BEGID|L_MIDID, NAME } },
  130.     { 'X', { L_BEGID|L_MIDID, NAME } },
  131.     { 'Y', { L_BEGID|L_MIDID, NAME } },
  132.     { 'Z', { L_BEGID|L_MIDID, NAME } },
  133.     { '.', { L_BEGID|L_MIDID, NAME } },
  134.     { '_', { L_BEGID|L_MIDID, NAME } },
  135.     { 'a', { L_BEGID|L_MIDID|L_DIGIT, NAME } },
  136.     { 'b', { L_BEGID|L_MIDID|L_DIGIT, NAME } },
  137.     { 'c', { L_BEGID|L_MIDID|L_DIGIT, NAME } },
  138.     { 'd', { L_BEGID|L_MIDID|L_DIGIT, NAME } },
  139.     { 'e', { L_BEGID|L_MIDID|L_DIGIT, NAME } },
  140.     { 'f', { L_BEGID|L_MIDID|L_DIGIT, NAME } },
  141.     { 'g', { L_BEGID|L_MIDID, NAME } },
  142.     { 'h', { L_BEGID|L_MIDID, NAME } },
  143.     { 'i', { L_BEGID|L_MIDID, NAME } },
  144.     { 'j', { L_BEGID|L_MIDID, NAME } },
  145.     { 'k', { L_BEGID|L_MIDID, NAME } },
  146.     { 'l', { L_BEGID|L_MIDID, NAME } },
  147.     { 'm', { L_BEGID|L_MIDID, NAME } },
  148.     { 'n', { L_BEGID|L_MIDID, NAME } },
  149.     { 'o', { L_BEGID|L_MIDID, NAME } },
  150.     { 'p', { L_BEGID|L_MIDID, NAME } },
  151.     { 'q', { L_BEGID|L_MIDID, NAME } },
  152.     { 'r', { L_BEGID|L_MIDID, NAME } },
  153.     { 's', { L_BEGID|L_MIDID, NAME } },
  154.     { 't', { L_BEGID|L_MIDID, NAME } },
  155.     { 'u', { L_BEGID|L_MIDID, NAME } },
  156.     { 'v', { L_BEGID|L_MIDID, NAME } },
  157.     { 'w', { L_BEGID|L_MIDID, NAME } },
  158.     { 'x', { L_BEGID|L_MIDID, NAME } },
  159.     { 'y', { L_BEGID|L_MIDID, NAME } },
  160.     { 'z', { L_BEGID|L_MIDID, NAME } }
  161. };
  162.  
  163. struct lexacts deflexact = { L_TOKEN, ERR };
  164.  
  165. static int lextabsize = (sizeof lextab) / (sizeof (struct lextab));
  166.  
  167. yyinit()
  168. {
  169.     {
  170.         register struct lexacts *ap;
  171.         
  172.         for ( ap = actions; ap < &actions[256]; ap++ )
  173.             *ap = deflexact;
  174.     }
  175.     {
  176.         register struct lextab *lp;
  177.         register struct lextab *ep;
  178.         
  179.         ep = &lextab[lextabsize];
  180.         for ( lp = lextab; lp < ep; lp++ )
  181.             actions[lp->select] = lp->action;
  182.     }
  183. }
  184.  
  185. yyprocess( c )
  186.     register char c;
  187. {
  188.     register int i;
  189.     char buf[256];
  190.     extern YYSTYPE yylval;
  191.     extern int line;
  192.  
  193.     switch ( c ) {
  194.     case '/':
  195.         c = yygetc();
  196.         if ( c != '*' ) {
  197.             yyungetc( c );
  198.             return 0;
  199.         }
  200.         do_star = 0;
  201.         for ( c = yygetc(); c; c = yygetc()) {
  202.             if ( c == '\n' ) {
  203.                 line++;
  204.             } else {
  205.                 if ( c == '*' ) {
  206.                     c = yygetc();
  207.                     if ( c == '/' ) {
  208.                         do_star = 1;
  209.                         return COMMENT;
  210.                     }
  211.                     yyungetc( c );
  212.                 }
  213.             }
  214.         }
  215.         error( line, "non-terminated comment");
  216.  
  217.     case '\'':
  218.         do_star = 0;
  219.         c = yygetc();
  220.         for ( i = 0; c; ) {
  221.             buf[i++] = c;
  222.             if ( c == '\\' ) 
  223.                 buf[i++] = yygetc();
  224.             c = yygetc();
  225.             if ( c == '\'' )
  226.                 break;
  227.         }
  228.         if (! c )
  229.             error( line, "non-terminated string" );
  230.         buf[i] = '\0';
  231.         yylval.str = STRCPY( buf );
  232.         do_star = 1;
  233.         return STRING;
  234.     case '"':
  235.         do_star = 0;
  236.         c = yygetc();
  237.         for (i = 0; c; ) {
  238.             buf[i++] = c;
  239.             if ( c == '\\' )
  240.                 buf[i++] = yygetc();
  241.             c = yygetc();
  242.             if ( c == '"' )
  243.                 break;
  244.         }
  245.         if (! c )
  246.             error( line, "non-terminated string" );
  247.         buf[i] = '\0';
  248.         yylval.str = STRCPY( buf );
  249.         do_star = 1;
  250.         return STRING;
  251.     case '<':
  252.         c = yygetc();
  253.         if ( c == '<' )
  254.             return LSH;
  255.         yyungetc( c );
  256.         return 0;
  257.     case '>':
  258.         c = yygetc();
  259.         if ( c == '>' )
  260.             return RSH;
  261.         yyungetc( c );
  262.         return 0;
  263.     case '@':
  264.         c = yygetc();
  265.         if ( c >= '0' && c <= '7' ) {
  266.             yyungetc( c );
  267.             return 0;
  268.         }
  269.         return ERR;
  270.     case '$':
  271.         c = yygetc();
  272.         if ( c >= '0' && c <= '9' ||
  273.                 c >= 'a' && c <= 'f' ||
  274.                         c >= 'A' && c <= 'F' ) {
  275.             yyungetc( c );
  276.             return 0;
  277.         }
  278.         return ERR;
  279.     case ';':
  280.         do_star = 0;
  281.         do {
  282.             c = yygetc();
  283.         } while ( c && c != '\n' );
  284.         if ( c )
  285.             yyungetc( c );
  286.         do_star = 1;
  287.         return COMMENT;
  288.     default:
  289.         return 0;
  290.     }
  291. }
  292.  
  293. yymodify( buf )
  294.     char *buf;
  295. {
  296.     register char *cp;
  297.  
  298.     for ( cp = buf; *cp; cp++ )
  299.         if ( isupper( *cp ) )
  300.             *cp = toupper( *cp );
  301. }
  302.